home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / DEMOS / HM2_DEMO / GEM_DEMO / GEM_DEMO.M < prev    next >
Encoding:
Text File  |  1992-12-14  |  28.8 KB  |  1,157 lines

  1. MODULE GEM_DEMO;
  2.  
  3. IMPORT Rts,GEMDOS,
  4.              AES,rsrc,evnt,graf,menu,objc,wind,
  5.              VDI,v,vr,vrt,vs,vsf,vswr,vst,
  6.              alert,app,desk,dial,draw,err,gpb,inf,list,mouse,pop,pops,rsc,redraw,
  7.              select,tree,util,vwk,wdial,xform,xfsel,xmenu,xobj;
  8. FROM SYSTEM IMPORT ADR,ADDRESS,CODE;
  9.  
  10. (* generated by RSC2MOD v3.10 (c) 1992 Christian Sprenger *)
  11.  
  12. CONST
  13.     D1                        =     0;    (* form tree *)
  14.  
  15.     D2                        =     1;    (* form tree *)
  16.     D2list                =     3;
  17.     D2vslid             =     4;
  18.     D2arr                 =     8;
  19.     D2pop                 =  10;
  20.     D2edit                =  11;
  21.     D2hslid             =  12;
  22.     D2open1             =  13;
  23.     D2ok                    =  14;
  24.     D2cancel            =  15;
  25.  
  26.     Menue                 =     2;    (* menu tree *)
  27.     Mabout                =     8;
  28.     Mdial1                =  18;
  29.     Mdial2                =  19;
  30.     Mdial3                =  20;
  31.     Mdial4                =  22;
  32.     Mdial5                =  23;
  33.     Mpopup                =  25;
  34.     Mquit                 =  27;
  35.     Mobject             =  29;
  36.     Mropt                 =  31;
  37.     Tool0                 =  33;
  38.     Tool9                 =  42;
  39.  
  40.     D3                        =     3;    (* form tree *)
  41.     D3msgbox            =     1;
  42.     D3msg0                =     2;
  43.     D3msg4                =     6;
  44.     D3result            =     7;
  45.     D3tree                =     8;
  46.     D3object            =     9;
  47.  
  48.     D4                        =     4;    (* form tree *)
  49.     D4list                =     6;
  50.     D4vslid             =     7;
  51.     D4arr                 =  11;
  52.     D4pop                 =  13;
  53.     D4hslid             =  15;
  54.     D4open5             =  16;
  55.     D4ok                    =  17;
  56.     D4canc                =  18;
  57.  
  58.     D5                        =     5;    (* form tree *)
  59.  
  60.     Popmenu             =     6;    (* form tree *)
  61.     Pdial1                =     3;
  62.     Pdial2                =     4;
  63.     Pdial3                =     5;
  64.     Pdial4                =     7;
  65.     Pdial5                =     8;
  66.  
  67.     D3menue             =     7;    (* menu tree *)
  68.     M3about             =     7;
  69.     M3d4                    =  16;
  70.     M3d5                    =  17;
  71.     M3pop                 =  19;
  72.     M3quit                =  21;
  73.  
  74.     D3icon                =     8;    (* form tree *)
  75.  
  76.     Desk                    =     9;    (* form tree *)
  77.     Dwin1                 =     1;
  78.     Dwin2                 =     2;
  79.     Dclip                 =     3;
  80.     Dexit                 =     4;
  81.     Dtrash                =     5;
  82.  
  83.     Setroll             =  10;    (* form tree *)
  84.     Break                 =     4;
  85.     Count                 =     6;
  86.     Rok                     =     8;
  87.     Rcanc                 =     9;
  88.  
  89.     Aboutbox            =  11;    (* form tree *)
  90.     Mosysbox            =     7;
  91.     Mosys                 =     9;
  92.     Imgbox                =  14;
  93.     Img0                    =  15;
  94.  
  95.     Form17                =  12;    (* form tree *)
  96.  
  97.     Form18a             =  13;    (* form tree *)
  98.  
  99.     Form18b             =  14;    (* form tree *)
  100.  
  101.     Form18c             =  15;    (* form tree *)
  102.  
  103.     Form19                =  16;    (* form tree *)
  104.  
  105.     Form20                =  17;    (* form tree *)
  106.  
  107.     Form21                =  18;    (* form tree *)
  108.     Arr21                 =  18;
  109.  
  110.     Form22                =  19;    (* form tree *)
  111.     Pos22c                =     9;
  112.     Pos22b                =  12;
  113.     Pos22a                =  15;
  114.     Slide22b            =  16;
  115.     Slide22c            =  17;
  116.     Slide22a            =  18;
  117.  
  118.     Form23a             =  20;    (* form tree *)
  119.  
  120.     Form23b             =  21;    (* form tree *)
  121.  
  122.     Form12                =  22;    (* form tree *)
  123.     Menu12                =     4;
  124.  
  125.     Menu                    =  23;    (* form tree *)
  126.     Mleft                 =     2;
  127.     Mright                =     3;
  128.     Msubmenu            =     5;
  129.     Mundo                 =     7;
  130.  
  131.     Submenu             =  24;    (* form tree *)
  132.     Smalert             =     2;
  133.     Smxfsel             =     3;
  134.     Smselect            =     4;
  135.     Smdialef            =     6;
  136.     Smdialbo            =     7;
  137.     Smroll0             =     9;
  138.     Smroll1             =  14;
  139.  
  140.     Formedit            =  25;    (* form tree *)
  141.     Sel_obj             =     8;
  142.     Editable            =     9;
  143.     Errdo                 =  12;
  144.  
  145.     Form24                =  26;    (* form tree *)
  146.     Sbox0n                =     7;
  147.     Vslid0n             =     8;
  148.     Sbox1                 =     9;
  149.     Vslid1                =  10;
  150.     Sbox01                =  11;
  151.     Vslid01             =  12;
  152.     Sbox0                 =  14;
  153.     Vslid0                =  15;
  154.     Hslid0n             =  16;
  155.  
  156.     Icons                 =  27;    (* form tree *)
  157.     Head0                 =  12;
  158.  
  159.     Form25                =  28;    (* form tree *)
  160.     Peol                    =  14;
  161.     Pdrv                    =  17;
  162.  
  163.     Form26                =  29;    (* form tree *)
  164.  
  165.     Choice                =  30;    (* form tree *)
  166.     Cleft                 =     2;
  167.     Cquit                 =     3;
  168.     Cright                =     4;
  169.  
  170.     Test                    =     0;    (* free image *)
  171.  
  172.     MaxTree  =    30;
  173.     MaxFrImg =     0;
  174.  
  175. (* END OF RESOURCE DEFINITIONS ---------------------------*)
  176.  
  177. CONST
  178. (*$? gpb.PIN:
  179.     TMax = 14; (* Dialoge 0..TMax *)
  180. *)
  181. (*$? ~gpb.PIN:
  182.     TMax = 13; (* Dialoge 0..TMax *)
  183. *)
  184.  
  185. VAR                             (* globale Variablen für DoTimer()-Animation *)
  186.     Inc,                        (* vorwärts oder rückwärts *)
  187.     Img: SHORTINT;    (* aktuelle Bildnummer *)
  188.  
  189. (*$E+*)
  190. PROCEDURE DoTimer(Usr: ADDRESS; Tree: objc.tpTree);
  191. (* zeigt Images in der Reihenfolge 0-1-2-3-4-3-2-1-0-.... *)
  192. BEGIN
  193.     IF (Img=0) OR (Img=4) THEN Inc := -Inc END;
  194.     tree.setf(Tree,Img0+Img,objc.HideTree);
  195.     INC(Img,Inc);
  196.     tree.clrf(Tree,Img0+Img,objc.HideTree);
  197.     objc.draw(Tree,Imgbox,10,Tree^[0].pos);
  198. END DoTimer;
  199.  
  200. PROCEDURE DoAbout();
  201. VAR
  202.     d: dial.tDial;
  203.     (*$R+*)i: SHORTINT;
  204. BEGIN
  205.     desk.select(Dwin2);
  206.     dial.init(d,Aboutbox);
  207.     dial.create(d);
  208.     FOR i:=0 TO 4 DO
  209.         d.Tree^[Img0+i].pos.y := d.Tree^[Img0].pos.y;
  210.         tree.chgf(d.Tree,Img0+i,objc.HideTree,i>0)
  211.     END;
  212.     d.Tree^[Imgbox].pos.h := d.Tree^[Img0].pos.h;
  213.     WITH d.Tree^[Mosys].pos DO
  214.         y := (d.Tree^[Mosysbox].pos.h - h) DIV 2
  215.     END;
  216.     Img := 0; Inc := -1;
  217.     dial.open(d);
  218.     i :=dial.xdo(d,0,FALSE,xform.NoKey,DoTimer,100);
  219.     EXCL(d.Tree^[i].state,objc.Selected);
  220.     dial.delete(d);
  221.     desk.deselect(Dwin2);
  222. END DoAbout;
  223.  
  224. (*--------------------------------------------------------*)
  225. (*$E+*)
  226. PROCEDURE DrawIt(Nr: LONGINT;
  227.                              HOff: LONGINT;
  228.                              Rect: AES.tRect;
  229.                              Clip: AES.tRect;
  230.                      Selected: BOOLEAN;
  231.                         UserVal: ADDRESS);
  232. VAR
  233.     str: ARRAY[0..65] OF CHAR;
  234.     i: SHORTINT;
  235.     pxy: ARRAY[0..1] OF VDI.tPoint;
  236. BEGIN
  237.     WITH Clip DO
  238.         pxy[0].x := x;
  239.         pxy[0].y := y;
  240.         pxy[1].x := x+w-1;
  241.         pxy[1].y := y+h-1;
  242.         vs.clip(vwk.hdl,TRUE,pxy);
  243.     END;
  244.     WITH Rect DO
  245.         str := ' __. line of list ';
  246.         str[1] := CHR(Nr DIV 10 + 60B);
  247.         str[2] := CHR(Nr MOD 10 + 60B);
  248.         str[HOff + w DIV vwk.charw] := 0C;
  249.         WITH Rect DO
  250.             IF Selected THEN
  251.                 pxy[0].x := x;     pxy[0].y := y;
  252.                 pxy[1].x := x+w-1; pxy[1].y := y+h-1;
  253.                 VOID(vsf.color(vwk.own,VDI.Black));
  254.                 vr.recfl(vwk.own,pxy);
  255.                 VOID(vsf.color(vwk.own,VDI.White));
  256.                 i := vswr.mode(vwk.own,vswr.XOR);
  257.                 v.gtext(vwk.own,x,y,AES.tpStr(ADR(str[HOff]))^); (* XOR ausgeben! *)
  258.                 i := vswr.mode(vwk.own,vswr.Replace);
  259.             ELSE
  260.                 v.gtext(vwk.own,x,y,AES.tpStr(ADR(str[HOff]))^); (* XOR ausgeben! *)
  261.             END
  262.         END;
  263.     END;
  264. END DrawIt;
  265.  
  266. VAR
  267.     p2: pops.tPops;
  268.     MCnt: SHORTINT;
  269.  
  270. (*$E+*)
  271. PROCEDURE React(WD: dial.tpDial; obj: SHORTINT; VAR msg: dial.tMsg);
  272. VAR
  273.     dnr,i: SHORTINT;
  274.     str: ARRAY[0..9] OF CHAR;
  275.     nr,typ: ARRAY[0..15] OF CHAR;
  276. BEGIN
  277.     IF WD=ADR(d1) THEN dnr := 1
  278.     ELSIF WD=ADR(d2) THEN dnr := 2
  279.     ELSE dnr := 3 END;
  280.     str := FORM(dnr); tree.setstr(d3.Tree,D3tree,str);
  281.     IF obj>=0 THEN
  282.         str := FORM(obj);
  283.         tree.setstr(d3.Tree,D3object,str);
  284.     ELSE
  285.         tree.setstr(d3.Tree,D3object,'--');
  286.         FOR i:=D3msg0 TO D3msg4 - 1 DO
  287.             tree.getstr(d3.Tree,i+1,typ); tree.setstr(d3.Tree,i,typ)
  288.         END;
  289.         CASE msg.type OF
  290.         |evnt.Closed:
  291.             wdial.close(WD^);
  292.             typ := 'Closed'
  293.         |evnt.Redraw:
  294.             typ := 'Redraw'
  295.         |evnt.Selected:
  296.             typ := 'Selected'
  297.         |evnt.Untopped:
  298.             typ := 'Untopped'
  299.         |evnt.OnTop:
  300.             typ := 'OnTop'
  301.         |evnt.CT_Update:
  302.             typ := 'CT_Update'
  303.         |evnt.CT_Move:
  304.             typ := 'CT_Move'
  305.         |evnt.CT_Newtop:
  306.             typ := 'CT_Newtop'
  307.         |evnt.CT_Key:
  308.             typ := 'CT_Key'
  309.         ELSE
  310.             typ := FORM('Msg #',msg.type)
  311.         END;
  312.         nr := FORM(' 0 ',typ);
  313.         IF MCnt>9 THEN nr[0] := CHR(MCnt DIV 10 + 60B) END;
  314.         nr[1] := CHR(MCnt MOD 10 + 60B);
  315.         tree.setstr(d3.Tree,D3msg4,nr);
  316.         MCnt := (MCnt+1) MOD 100;
  317.         wdial.draw_obj(d3,D3msgbox,-1);
  318.         IF (msg.type=evnt.Selected) & (msg.id=-d3.WHdl) THEN
  319.             CASE msg.entry OF
  320.             |M3about: DoAbout
  321.             |M3d4     : DoDial(0,D[0])
  322.             |M3d5     : DoDial(1,D[1])
  323.             |M3pop    : DoDial(2,D[2])
  324.             |M3quit : Quit := TRUE
  325.             END;
  326.             wdial.tnormal(d3,msg.title,TRUE)
  327.         END
  328.     END;
  329.     wdial.draw_obj(d3,D3result,-1);
  330.     WITH WD^ DO
  331.         IF dnr=2 THEN
  332.             CASE obj OF
  333.             |D2list,
  334.              D2vslid,
  335.              D2hslid: list.handle(d2,D2list,obj)
  336.             |D2arr: VOID(util.arr_chgval(d2,D2arr))
  337.             |D2pop: pops.handle(d2,p2)
  338.             |D2ok,D2cancel:
  339.                 wdial.close(d2)
  340.             |D2open1:
  341.                 DoMenu(4,Mdial1);
  342.             ELSE
  343.             END
  344.         ELSIF dnr=1 THEN
  345.             IF (obj=-1) & (msg.type=evnt.Closed) OR (obj>0) THEN
  346.                 CloseD1
  347.             END
  348.         END;
  349.         IF (obj>=0) & tree.tests(Tree,obj,objc.Selected) THEN
  350.             tree.clrs(Tree,obj,objc.Selected);
  351.             IF WHdl>=0 THEN
  352.                 redraw.tree(WHdl,Tree,obj,8,Rect)
  353.             END
  354.         END
  355.     END
  356. END React;
  357. (*$E-*)
  358.  
  359. VAR
  360.     Sel4: ARRAY[0..1] OF BITSET;
  361.     p4: pops.tPops;
  362.  
  363. (*$E+*)
  364. PROCEDURE DoDial(idx: SHORTINT; VAR d: dial.tDial);
  365. VAR
  366.     rtree: objc.tpTree;
  367.     res,x,y: SHORTINT;
  368.     dum: BITSET;
  369.     Delay,Cnt: SHORTINT;
  370. BEGIN
  371.     WITH d DO
  372.         IF idx#2 THEN (* Dialoge *)
  373.             dial.create(d);
  374.             Delay := inf.xmenuDelay;
  375.             Cnt := cnt;
  376.             IF idx=0 THEN (* Dialog 4 *)
  377.                 list.create(d,D4list,D4vslid,vwk.charh,0,32,DrawIt,
  378.                     ADR(Sel4),0,xobj.Sel0_n,NIL);
  379.                 list.create_hor(d,D4list,D4hslid,vwk.charw,0,18);
  380.                 util.arr_setval(D[0],D4arr,0,-999,999);
  381.                 pops.create2(D[0],D4pop,0,pstr,p4);
  382.             ELSIF idx=3 THEN (* RollMenü-Optionen *)
  383.                 util.arr_setval(d,Break,Delay,0,20);
  384.                 util.arr_setval(d,Count,Cnt,0,99);
  385.             END;
  386.             dial.open(d);
  387.             LOOP
  388.                 res := dial.do(d,0);
  389.                 IF idx=0 THEN
  390.                     CASE res OF
  391.                     |D4list,
  392.                      D4vslid,
  393.                      D4hslid: list.handle(D[0],D4list,res)
  394.                     |D4arr:     VOID(util.arr_chgval(D[0],D4arr))
  395.                     |D4pop:     pops.handle(D[0],p4)
  396.                     |D4open5: DoDial(1,D[1]);
  397.                                         wdial.deselect(D[0],D4open5)
  398.                     ELSE EXIT
  399.                     END
  400.                 ELSIF idx=1 THEN EXIT
  401.                 ELSIF idx=3 THEN
  402.                     CASE res OF
  403.                     |Break: Delay := util.arr_chgval(d,Break)
  404.                     |Count: Cnt := util.arr_chgval(d,Count);
  405.                     |Rok:     inf.xmenuDelay := Delay;
  406.                                     cnt := Cnt; xmenu.setroll(MenuTree,Tool0,cnt,GetItem);
  407.                                     EXIT
  408.                     |Rcanc: EXIT
  409.                     END
  410.                 END;
  411.             END;
  412.             EXCL(Tree^[res].state,objc.Selected);
  413.             dial.delete(d);
  414.         ELSE (* Popup-Menüs *)
  415.             pop.create(d);
  416.             graf.mkstate(x,y,dum,dum);
  417.             pop.open(d,x,y);
  418.             pop.menu(d,TRUE,rtree,res);
  419.             pop.delete(d);
  420.             CASE res OF
  421.             |Pdial1: OpenD1
  422.             |Pdial2: IF wdial.open(d2,0) THEN END;
  423.             |Pdial3: IF wdial.open(d3,0) THEN END;
  424.             |Pdial4: DoDial(0,D[0])
  425.             |Pdial5: DoDial(1,D[1])
  426.             ELSE (* nichts, war Klick daneben *)
  427.             END
  428.         END;
  429.     END
  430. END DoDial;
  431. (*$E-*)
  432.  
  433. PROCEDURE DoKey(key: AES.tKey; state: BITSET): BOOLEAN;
  434. VAR
  435.     ignored: BOOLEAN;
  436. BEGIN
  437.     IF evnt.Ctrl IN state THEN
  438.         ignored := FALSE;
  439.         CASE dial.key(key.scan) OF
  440.         |'1': DoMenu(4,Mdial1);
  441.         |'2': DoMenu(4,Mdial2);
  442.         |'3': DoMenu(4,Mdial3);
  443.         |'4': DoMenu(4,Mdial4);
  444.         |'5': DoMenu(4,Mdial5);
  445.         |'p': DoMenu(4,Mpopup);
  446.         |'o': DoMenu(5,Mobject);
  447.         |'q': DoMenu(4,Mquit);
  448.         ELSE
  449.             ignored := TRUE;
  450.         END
  451.     ELSE
  452.         ignored := TRUE;
  453.     END;
  454.     RETURN ignored
  455. END DoKey;
  456.  
  457. PROCEDURE OpenD1();
  458. BEGIN
  459.     IF ~d1.Open THEN wdial.level(TRUE) END;
  460.     IF ~wdial.open(d1,0) THEN wdial.level(FALSE) END;
  461.     menu.ienable(MenuTree,Mabout,~d1.Open);
  462.     menu.ienable(MenuTree,Mdial2,~d1.Open);
  463.     menu.ienable(D[2].Tree,Pdial2,~d1.Open);
  464.     menu.ienable(D[2].Tree,Pdial3,~d1.Open);
  465. END OpenD1;
  466.  
  467. PROCEDURE CloseD1();
  468. BEGIN
  469.     wdial.close(d1);
  470.     wdial.level(FALSE);
  471.     menu.ienable(MenuTree,Mabout,TRUE);
  472.     menu.ienable(MenuTree,Mdial2,TRUE);
  473.     menu.ienable(D[2].Tree,Pdial2,TRUE);
  474.     menu.ienable(D[2].Tree,Pdial3,TRUE);
  475. END CloseD1;
  476.  
  477. PROCEDURE DoMenu(title,entry: SHORTINT);
  478. BEGIN
  479.     menu.tnormal(MenuTree,title,FALSE);
  480.     CASE entry OF
  481.     |Mabout:    DoAbout
  482.     |Mdial1:    OpenD1
  483.     |Mdial2:    IF wdial.open(d2,0) THEN END;
  484.     |Mdial3:    IF wdial.open(d3,0) THEN END;
  485.     |Mdial4:    DoDial(0,D[0])
  486.     |Mdial5:    DoDial(1,D[1])
  487.     |Mpopup:    DoDial(2,D[2])
  488.     |Mquit:     Quit := TRUE
  489.     |Mobject: DoDemo
  490.     |Mropt:     desk.select(Dwin1);
  491.                         DoDial(3,D[3]);
  492.                         desk.deselect(Dwin1);
  493.     ELSE
  494.     END;
  495.     menu.tnormal(MenuTree,title,TRUE);
  496. END DoMenu;
  497.  
  498. (*$E+*)
  499. PROCEDURE GetItem(nr,cnt: SHORTINT;
  500.                                 VAR item: xobj.tRStr;
  501.                              VAR state: BITSET);
  502. BEGIN
  503.     IF nr<cnt THEN
  504.         item := '  Item #00';
  505.         item[8] := CHR(nr DIV 10 + 60B);
  506.         item[9] := CHR(nr MOD 10 + 60B);
  507.         state := {};
  508.         IF nr MOD 4=0 THEN INCL(state,objc.Checked) END;
  509.         IF nr MOD 5=4 THEN INCL(state,objc.Disabled) END;
  510.     ELSE
  511.         item := '  ---';
  512.         state := {objc.Disabled};
  513.     END
  514. END GetItem;
  515. (*$E-*)
  516.  
  517. (*------------------------- DESKTOP ICONS ----------------------------*)
  518.  
  519. VAR
  520.     PAR: RECORD
  521.         work: AES.tRect;
  522.         X,Y: SHORTINT;
  523.         pos: ARRAY[Dwin1..Dtrash] OF RECORD x,y: SHORTINT END;
  524.     END;
  525.  
  526. PROCEDURE DoButton(X,Y,Clix: SHORTINT);
  527. VAR
  528.     icon: SHORTINT;
  529.     MoState,KState: BITSET;
  530. BEGIN
  531.     IF desk.win()=wind.find(X,Y) THEN
  532.         icon := objc.find(DeskTree,0,10,X,Y);
  533.         IF icon>0 THEN
  534.             IF Clix=1 THEN
  535.                 desk.move(icon)
  536.             ELSE
  537.                 CASE icon OF
  538.                 |Dclip:  SaveDesk
  539.                 |Dexit:  Quit := TRUE
  540.                 |Dtrash: LoadDesk
  541.                 |Dwin1:  DoMenu(5,Mropt);
  542.                 |Dwin2:  DoMenu(3,Mabout);
  543.                 ELSE
  544.                 END
  545.             END
  546.         END
  547.     END;
  548. END DoButton;
  549.  
  550. PROCEDURE LoadDesk;
  551. VAR
  552.     (*$R+*)f: SHORTINT;
  553.     (*$R+*)i: SHORTINT;
  554. BEGIN
  555.     f := GEMDOS.Fopen('GEM_DEMO.PAR',GEMDOS.ReadOnly);
  556.     IF f>=0 THEN
  557.         WITH PAR DO
  558.             work.w := -1;
  559.             VOID(GEMDOS.Fread(f,SIZE(PAR),ADR(PAR)));
  560.             VOID(GEMDOS.Fclose(f));
  561.             IF work.w>=0 THEN
  562.                 FOR i:=Dwin1 TO Dtrash DO
  563.                     desk.setpos(i,pos[i].x,pos[i].y)
  564.                 END;
  565.             END
  566.         END
  567.     END;
  568. END LoadDesk;
  569.  
  570. PROCEDURE SaveDesk;
  571. VAR
  572.     (*$R+*)f: SHORTINT;
  573.     (*$R+*)i: SHORTINT;
  574. BEGIN
  575.     f := GEMDOS.Fcreate('GEM_DEMO.PAR',{});
  576.     IF f>=0 THEN
  577.         WITH PAR DO
  578.             FOR i:=Dwin1 TO Dtrash DO
  579.                 desk.getpos(i,pos[i].x,pos[i].y)
  580.             END;
  581.             desk.getsize(work,X,Y);
  582.             VOID(GEMDOS.Fwrite(f,SIZE(PAR),ADR(PAR)));
  583.             VOID(GEMDOS.Fclose(f))
  584.         END;
  585.     END;
  586. END SaveDesk;
  587.  
  588. (*--------------------------------------------------------------------*)
  589.  
  590. (*$E+*)
  591. PROCEDURE DoObjKey(Usr: ADDRESS;
  592.                              Tree: objc.tpTree;
  593.                     VAR state: BITSET;
  594.                         VAR key: AES.tKey;
  595.                  VAR Status: xform.tXform): BOOLEAN;
  596. VAR
  597.     p: dial.tDial;
  598.     res,x,y: SHORTINT;
  599.     db: BITSET;
  600.     cmd: BOOLEAN;
  601. BEGIN
  602.     IF SHORTINT(key)=-1 THEN
  603.         res := evnt.button(1,{0,1},{},x,y,db,db);
  604.         dial.init(p,Choice);
  605.         pop.create(p);
  606.         pop.open(p,x-p.Tree^[0].pos.w DIV 2,y - vwk.charh DIV 2);
  607.         pop.menu(p,TRUE,p.Tree,res);
  608.         pop.delete(p);
  609.         key.char := 0C;
  610.         CASE res OF
  611.         |Cleft:  key.scan := CHR(48H); state := {evnt.Ctrl}
  612.         |Cquit:  key.scan := CHR(61H); state := {}
  613.         |Cright: key.scan := CHR(50H); state := {evnt.Ctrl}
  614.         ELSE RETURN FALSE
  615.         END
  616.     END;
  617.     cmd := TRUE;
  618.     CASE key.scan OF
  619.     |CHR(61H): TheTree := -1
  620.     |CHR(48H): IF evnt.Ctrl IN state THEN
  621.                              DEC(TheTree); IF TheTree<0 THEN TheTree := TMax END
  622.                          ELSE cmd := FALSE END;
  623.     |CHR(50H): IF evnt.Ctrl IN state THEN
  624.                              INC(TheTree); IF TheTree>TMax THEN TheTree := 0 END
  625.                          ELSE cmd := FALSE END;
  626.     ELSE
  627.         cmd := FALSE;
  628.     END;
  629.     IF cmd THEN
  630.         WITH Status DO
  631.             NextObj := 0;
  632.             Cont := FALSE;
  633.         END;
  634.         RETURN TRUE
  635.     ELSE RETURN FALSE
  636.     END
  637. END DoObjKey;
  638.  
  639. (*$E+*)
  640. PROCEDURE menuItem(i,count: SHORTINT; VAR txt: xobj.tRStr; VAR s: BITSET);
  641. BEGIN
  642. (* Da TMax > 4 = Anzahl der Zeilen im Rollmenu, kann die Abfrage entfallen *)
  643. (***     IF i<count THEN ***)
  644.         txt := TTit[i]; s := {}
  645. (***     ELSE ***)
  646. (***         txt := '  leer'; s := {objc.Disabled} ***)
  647. (***     END; ***)
  648. END menuItem;
  649.  
  650. (*- Zeichenfunktionen für ItemList-Objekte ---------------------------------*)
  651.  
  652. (*$E+*)
  653. PROCEDURE DrawIt1(Nr: LONGINT;
  654.                                 HOff: LONGINT;
  655.                                 Rect: AES.tRect;
  656.                                 Clip: AES.tRect;
  657.                         Selected: BOOLEAN;
  658.                                 User: ADDRESS);
  659. VAR
  660.     str: ARRAY[0..65] OF CHAR;
  661.     i: SHORTINT;
  662.     pxy: ARRAY[0..1] OF VDI.tPoint;
  663. BEGIN
  664.     WITH Rect DO
  665.         str := 'Dies ist die __-te Zeile dieses Beispiels.                       ';
  666.         FOR i:=64 TO 64-Nr BY -1 DO str[i] := '_' END;
  667.         str[13] := CHR(Nr DIV 10 + 60B);
  668.         str[14] := CHR(Nr MOD 10 + 60B);
  669.         str[HOff + w DIV vwk.charw] := 0C;
  670.         WITH Rect DO
  671.             IF Selected THEN
  672.                 pxy[0].x := x;     pxy[0].y := y;
  673.                 pxy[1].x := x+w-1; pxy[1].y := y+h-1;
  674.                 VOID(vsf.color(vwk.own,VDI.Black));
  675.                 vr.recfl(vwk.own,pxy);
  676.                 VOID(vsf.color(vwk.own,VDI.White));
  677.                 i := vswr.mode(vwk.own,vswr.XOR);
  678.                 v.gtext(vwk.own,x,y,AES.tpStr(ADR(str[HOff]))^); (* XOR ausgeben! *)
  679.                 i := vswr.mode(vwk.own,vswr.Replace);
  680.             ELSE
  681.                 v.gtext(vwk.own,x,y,AES.tpStr(ADR(str[HOff]))^); (* XOR ausgeben! *)
  682.             END
  683.         END;
  684.     END;
  685. END DrawIt1;
  686.  
  687. VAR
  688.     IconTree: objc.tpTree;
  689.  
  690. PROCEDURE DrawIt2(Nr: LONGINT;
  691.                                 HOff: LONGINT;
  692.                                 Rect: AES.tRect;
  693.                                 Clip: AES.tRect;
  694.                         Selected: BOOLEAN;
  695.                                 User: ADDRESS);
  696. VAR
  697.     mfdb: VDI.tMFDB;
  698.     pxy: ARRAY[0..3] OF VDI.tPoint;
  699.     ColIdx: ARRAY[0..1] OF SHORTINT;
  700. BEGIN
  701.     WITH Rect DO
  702.         draw.clear(x,y,w,h);
  703.         WITH IconTree^[Nr+1].iconblk^ DO
  704.             WITH mfdb DO
  705.                 W := icon.w; WdWidth := W DIV 16; H := icon.h;
  706.                 Stand := 0; NPlanes := 1; Addr := pdata;
  707.             END;
  708.             pxy[0].x := 0;                        pxy[0].y := 0;
  709.             pxy[1].x := icon.w-1;         pxy[1].y := icon.h-1;
  710.             pxy[2].x := x+8;                    pxy[2].y := y;
  711.             pxy[3].x := x+8+icon.w-1; pxy[3].y := y+icon.h-1;
  712.             ColIdx[0] := 1; ColIdx[1] := 0;
  713.             vrt.cpyfm(vwk.own,3,pxy,mfdb,vwk.scrMFDB,ColIdx);
  714.             v.gtext(vwk.own,x+48,y+(h-vwk.charh) DIV 2,ptext^);
  715.         END;
  716.         IF Selected THEN draw.invert(x,y,w,h) END
  717.     END
  718. END DrawIt2;
  719. (*$E-*)
  720.  
  721. (*- Funktionen für pops-Objekte --------------------------------------------*)
  722.  
  723. (*$E+*)
  724. PROCEDURE GetDrv(Nr: SHORTINT;
  725.                         VAR str: STRING;
  726.                              user: ADDRESS);
  727. BEGIN
  728.     str[0] := CHR(Nr+41H); str[1] := ':'; str[2] := 0C;
  729. END GetDrv;
  730. (*$E-*)
  731.  
  732. (*--------------------------------------------------------------------------*)
  733.  
  734. PROCEDURE Dialog(idx: SHORTINT);
  735. VAR
  736.     rTree: objc.tpTree;
  737.     sub,popd,d: dial.tDial;
  738.     i,val,rObj: SHORTINT;
  739.     num: ARRAY[0..4] OF CHAR;
  740.     bool: BOOLEAN;
  741.     sel1: ARRAY[0..1] OF BITSET; (* 2x16=32 Bit *)
  742.     EolP,DrvP: pops.tPops;
  743.     EolS: ARRAY[0..15] OF CHAR;
  744. BEGIN
  745.     dial.init(d,idx);
  746.     dial.create(d);
  747.     CASE idx OF
  748.     |Form21:    util.arr_setval(d,Arr21,0,-999,999)
  749.     |Form22:    util.slide_set(d,Slide22a,0,15,5);
  750.                         util.slide_set(d,Slide22b,0,15,5);
  751.                         util.slide_set(d,Slide22c,3,7,1);
  752.                         tree.setstr(d.Tree,Pos22a,'0  ');
  753.                         tree.setstr(d.Tree,Pos22b,'0  ');
  754.                         rsrc.gaddr(rsrc.Tree,Icons,IconTree);
  755.                         d.Tree^[Pos22c].iconblk^.pdata := IconTree^[Head0+3].bitblk^.pdata;
  756.     |Form24:    rsrc.gaddr(rsrc.Tree,Icons,IconTree);
  757.                         sel1[0] := {}; sel1[1] := {};
  758.                         list.create(d,Sbox0n,Vslid0n,vwk.charh,0,32,DrawIt1,
  759.                             ADR(sel1),0,xobj.Sel0_n,NIL);
  760.                         list.create_hor(d,Sbox0n,Hslid0n,vwk.charw,0,65);
  761.                         list.create(d,Sbox0,Vslid0,32,0,11,DrawIt2,NIL,1,xobj.Sel0,NIL);
  762.                         list.create(d,Sbox01,Vslid01,32,0,11,DrawIt2,NIL,1,xobj.Sel0_1,NIL);
  763.                         list.create(d,Sbox1,Vslid1,32,0,11,DrawIt2,NIL,1,xobj.Sel1,NIL);
  764.     |Form25:    pops.create(d,Pdrv,2,i,16,GetDrv,NIL,DrvP);
  765.                         EolS := 'CrLf|Cr|Lf|0C';
  766.                         pops.create2(d,Peol,2,EolS,EolP);
  767.     ELSE
  768.     END;
  769.     dial.open(d);
  770.     IF idx=Form12 THEN (* Popup-Menüs abhandeln *)
  771.         REPEAT
  772.             i := dial.xdo(d,0,TRUE,DoObjKey,xform.NoTimer,0);
  773.             IF i=Menu12 THEN
  774.                 dial.init(sub,Submenu);
  775.                 (* Optionen setzen *)
  776.                 tree.chgs(sub.Tree,Smdialef,objc.Checked,inf.dialEffect);
  777.                 tree.chgs(sub.Tree,Smdialbo,objc.Checked,~inf.dialBorder);
  778.                 pop.create(sub);
  779.                 xmenu.setroll(sub.Tree,Smroll0,TMax+1,menuItem);
  780.                 dial.init(popd,Menu);
  781.                 pop.create(popd);
  782.                 pop.chain(popd,Msubmenu,sub);
  783.                 pop.open(popd,xform.MoX-8,xform.MoY);
  784.                 pop.menu(popd,TRUE,rTree,rObj);
  785.                 pop.close(popd);
  786.  
  787.                 IF (rTree=popd.Tree) & (rObj>0) THEN
  788.                     CASE rObj OF
  789.                     |Mleft:  DEC(TheTree); IF TheTree<0 THEN TheTree := TMax END
  790.                     |Mright: INC(TheTree); IF TheTree>TMax THEN TheTree := 0 END
  791.                     |Mundo:  TheTree := -1
  792.                     ELSE (* nix *)
  793.                     END;
  794.                     i := 0;
  795.                 ELSIF (rTree=sub.Tree) & (rObj>0) THEN
  796.                     CASE rObj OF
  797.                     |Smalert:  AlertDemo
  798.                     |Smxfsel:  DoXfsel
  799.                     |Smselect: DoSelect
  800.                     |Smroll0..Smroll1:
  801.                         TheTree := xmenu.getroll(sub.Tree,Smroll0,rObj); i := 0
  802.                     ELSE (* nix *)
  803.                     END;
  804.                 END;
  805.  
  806.                 pop.delete(sub);
  807.                 pop.delete(popd);
  808.                 (* Optionen holen *)
  809.                 inf.dialEffect := tree.tests(sub.Tree,Smdialef,objc.Checked);
  810.                 inf.dialBorder := ~tree.tests(sub.Tree,Smdialbo,objc.Checked);
  811.                 tree.deselect(d.Tree,Menu12)
  812.             END
  813.         UNTIL i=0
  814.     ELSIF idx=Form21 THEN (* PfeilBox abhandeln *)
  815.         REPEAT
  816.             i := dial.xdo(d,0,TRUE,DoObjKey,xform.NoTimer,0);
  817.             IF i=Arr21 THEN VOID(util.arr_chgval(d,Arr21)) END
  818.         UNTIL i=0
  819.     ELSIF idx=Form24 THEN (* Listen abhandeln *)
  820.         REPEAT
  821.             i := dial.xdo(d,0,TRUE,DoObjKey,xform.NoTimer,0);
  822.             CASE i OF
  823.             |Sbox0n,Vslid0n,Hslid0n:
  824.                 list.handle(d,Sbox0n,i)
  825.             |Sbox01,Vslid01:
  826.                 list.handle(d,Sbox01,i)
  827.             |Sbox0,Vslid0:
  828.                 list.handle(d,Sbox0,i)
  829.             |Sbox1,Vslid1:
  830.                 list.handle(d,Sbox1,i)
  831.             ELSE
  832.             END
  833.         UNTIL i=0
  834.     ELSIF idx=Form25 THEN (* Pops abhandeln *)
  835.         LOOP
  836.             i := dial.xdo(d,0,TRUE,DoObjKey,xform.NoTimer,0);
  837.             CASE i OF
  838.             |Peol: pops.handle(d,EolP)
  839.             |Pdrv: pops.handle(d,DrvP)
  840.             |0: EXIT
  841.             ELSE
  842.             END
  843.         END;
  844.     ELSIF idx=Formedit THEN
  845.         val := -1;
  846.         REPEAT
  847.             i := dial.xdo(d,0,FALSE,DoObjKey,xform.NoTimer,0);
  848.             IF i#0 THEN
  849.                 IF i=Errdo THEN
  850.                     err.do(d.Tree,Editable,
  851.                         'Dies ist eine 2-zeilige Fehlermeldung mit err.do().',
  852.                         '(Abbruch mit Taste oder Mausklick)');
  853.                 ELSE (* Sel_obj *)
  854.                     select.obj(d.Tree,
  855.                         'Auswahl',"Eine Auswahl an|Texten mittels|select.obj().|Ein einziger|Aufruf behandelt|diese Auswahlbox!",
  856.                             Editable,NIL,val);
  857.                 END;
  858.                 tree.deselect(d.Tree,i)
  859.             END
  860.         UNTIL i=0
  861.     ELSIF idx=Form22 THEN
  862.         REPEAT
  863.             i := dial.xdo(d,0,FALSE,DoObjKey,xform.NoTimer,0);
  864.             IF i=Slide22a THEN
  865.                 val := util.slide_get(d,Slide22a);
  866.                 num := FORM(val,' ');
  867.                 tree.setstr(d.Tree,Pos22a,num);
  868.                 tree.draw(d.Tree,Pos22a,0)
  869.             ELSIF i=Slide22b THEN
  870.                 val := util.slide_get(d,Slide22b);
  871.                 num := FORM(val,' ');
  872.                 tree.setstr(d.Tree,Pos22b,num);
  873.                 tree.draw(d.Tree,Pos22b,0)
  874.             ELSIF i=Slide22c THEN
  875.                 val := util.slide_get(d,Slide22c);
  876.                 d.Tree^[Pos22c].iconblk^.pdata := IconTree^[Head0+val].bitblk^.pdata;
  877.                 objc.draw(d.Tree,Pos22c,1,d.Rect)
  878.             END;
  879.         UNTIL i=0
  880.     ELSE
  881.         REPEAT
  882.             i := dial.xdo(d,0,FALSE,DoObjKey,xform.NoTimer,0);
  883.         UNTIL i=0                  (* DoObjKey() liefert 0 für Links/Rechts/Undo *)
  884.     END;
  885.     dial.delete(d);
  886. END Dialog;
  887.  
  888. (*-------- Demonstration der Alerts -----------------------------------------*)
  889.  
  890. (* das folgende Image wurde mit dem Programm IED erstellt *)
  891.  
  892. (*$E-*)(*$D-*)(*$S-*)
  893. PROCEDURE FaceImg;
  894. BEGIN;
  895.     CODE(00000H,00008H,00000H,0001CH,00000H,0001EH,001FCH,0003FH);
  896.     CODE(007FFH,0003FH,01FFFH,0E03EH,03FFFH,0F07CH,07FFFH,0F078H);
  897.     CODE(07FFFH,0F878H,0FFFFH,0F870H,0FFFFH,0F870H,0FFFFH,0F800H);
  898.     CODE(0FFFFH,0F860H,0FFFFH,0F860H,07FFFH,0B800H,07FFFH,0FC00H);
  899.     CODE(03FFFH,0FE00H,01FFFH,0FE00H,01FFFH,0FE00H,00FFFH,0FC00H);
  900.     CODE(00FFFH,0F800H,007FFH,0F800H,007FFH,0F800H,00FFFH,0F000H);
  901.     CODE(00FFFH,0F000H,01FFFH,0C000H,03FF8H,00000H,03FF8H,00000H);
  902.     CODE(00FF8H,00000H,003F8H,00000H,000F8H,00000H,00038H,00000H);
  903.     CODE(04661H,06365H,0496DH,06700H,0A2A2H,0A2A2H,0A2A2H,0A2A2H);
  904.     CODE(0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H,0A2A2H); (*$P+*)
  905. END FaceImg; (*$P-*)(*$S=*)(*$D=*)
  906.  
  907. PROCEDURE AlertDemo;
  908. VAR
  909.     i: SHORTINT;
  910. BEGIN
  911.     IF alert.ualert(1,2,'[0][1. Zeile][OK|Abbruch]')=2 THEN
  912.         RETURN
  913.     END;
  914.     IF alert.ualert(1,2,'[1][1. Zeile][OK|Abbruch]')=2 THEN
  915.         RETURN
  916.     END;
  917.     alert.display('[0][1. Zeile][]');
  918.     evnt.timer(1000);
  919.     alert.display('[1][1. Zeile][]');
  920.     evnt.timer(1000);
  921.  
  922.     IF alert.ualert(1,2,'[0][1. Zeile|2. Zeile][OK|Abbruch]')=2 THEN
  923.         RETURN
  924.     END;
  925.     IF alert.ualert(1,2,'[2][1. Zeile|2. Zeile][OK|Abbruch]')=2 THEN
  926.         RETURN
  927.     END;
  928.     alert.display('[0][1. Zeile|2. Zeile][]');
  929.     evnt.timer(1000);
  930.     alert.display('[1][1. Zeile|2. Zeile][]');
  931.     evnt.timer(1000);
  932.  
  933.     IF alert.ualert(1,2,'[0][1. Zeile|2. Zeile|3. Zeile][OK|Abbruch]')=2 THEN
  934.         RETURN
  935.     END;
  936.     IF alert.ualert(1,2,'[3][1. Zeile|2. Zeile|3. Zeile][OK|Abbruch]')=2 THEN
  937.         RETURN
  938.     END;
  939.     alert.display('[0][1. Zeile|2. Zeile|3. Zeile][]');
  940.     evnt.timer(1000);
  941.     alert.display('[1][1. Zeile|2. Zeile|3. Zeile][]');
  942.     evnt.timer(1000);
  943.  
  944.     IF alert.ualert(1,2,'[0][1. Zeile|2. Zeile|3. Zeile|4. Zeile][OK|Abbruch]')=2 THEN
  945.         RETURN
  946.     END;
  947.     IF alert.ualert(1,2,'[1][1. Zeile|2. Zeile|3. Zeile|4. Zeile][OK|Abbruch]')=2 THEN
  948.         RETURN
  949.     END;
  950.     alert.display('[0][1. Zeile|2. Zeile|3. Zeile|4. Zeile][]');
  951.     evnt.timer(1000);
  952.     alert.display('[2][1. Zeile|2. Zeile|3. Zeile|4. Zeile][]');
  953.     evnt.timer(1000);
  954.  
  955.     IF alert.ualert(1,2,'[0][1. Zeile|2. Zeile|3. Zeile|4. Zeile|5. Zeile][OK|Abbruch]')=2 THEN
  956.         RETURN
  957.     END;
  958.     IF alert.ualert(1,2,'[3][1. Zeile|2. Zeile|3. Zeile|4. Zeile|5. Zeile][OK|Abbruch]')=2 THEN
  959.         RETURN
  960.     END;
  961.     alert.display('[0][1. Zeile|2. Zeile|3. Zeile|4. Zeile|5. Zeile][]');
  962.     evnt.timer(1000);
  963.     alert.display('[1][1. Zeile|2. Zeile|3. Zeile|4. Zeile|5. Zeile][]');
  964.     evnt.timer(1000);
  965.     alert.remove;
  966.  
  967.     alert.Image := ADDRESS(FaceImg);
  968.     i := alert.ualert(1,2,
  969.         '[4][Außerdem sind bis zu vier Knöpfe und eigene Images möglich.| |Die Breite ist nicht auf 30, sondern auf 80 Zeichen begrenzt!][OK|Ja|Aha|Doll]');
  970. END AlertDemo;
  971.  
  972. (*-------- Demonstration des Selektors --------------------------------------*)
  973.  
  974. (*$E+*)
  975. PROCEDURE GetSubItem(nr: SHORTINT; VAR item: STRING; user: ADDRESS);
  976. VAR
  977.     i: SHORTINT;
  978.     s: ARRAY[0..15] OF CHAR;
  979. BEGIN
  980.     s := 'CHR(xxx) = " "';
  981.     s[4] := CHR(nr DIV 100 + 60B);
  982.     s[5] := CHR(nr DIV 10 MOD 10 + 60B);
  983.     s[6] := CHR(nr MOD 10 + 60B);
  984.     IF nr>0 THEN s[12] := CHR(nr) END;
  985.     FOR i:=0 TO 14 DO item[i] := s[i] END
  986. END GetSubItem;
  987.  
  988. PROCEDURE DoSelect;
  989. BEGIN
  990.     (* erst mal mit festen Strings *)
  991.     REPEAT
  992.     UNTIL select.str(' Länderwahl ',
  993.     ' Baden-Württemberg| Bayern| Berlin| Brandenburg| Bremen| Hamburg| Hessen| Mecklenburg-Vorpommern| Niedersachsen| Nordrhein-Westfalen| Rheinland-Pfalz| Saarland| Sachsen| Sachsen-Anhalt| Schleswig-Holstein| Thüringen',
  994.     NIL,2)>=0;
  995.     (* jetzt raffinierter mit einer Prozedur *)
  996.     REPEAT
  997.     UNTIL select.do(TRUE,'Zeichen',256,14,GetSubItem,NIL,64)>=0;
  998.     (* erst mal mit festen Strings *)
  999. END DoSelect;
  1000.  
  1001. (*-------- Demonstration der Dateiauswahl -----------------------------------*)
  1002.  
  1003. PROCEDURE DoXfsel;
  1004. VAR
  1005.     path,patt,file: ARRAY[0..79] OF CHAR;
  1006. BEGIN
  1007. (*    path := '.\*.PRG'; (* der Pfad wird automatisch expandiert *)*)
  1008.     path := '.\*.*'; (* der Pfad wird automatisch expandiert *)
  1009.     file := 'GEM_DEMO.PRG';
  1010.     REPEAT
  1011.     UNTIL xfsel.input(path,file,'Die erweiterte Dateiauswahl');
  1012.     xfsel.labels('PATH:','SELECT ','DRIVES:','OK','CANCEL');
  1013.     path := 'C:\'; patt := '*.APP,*.PRG,*.TOS,*.TTP'; file := '';
  1014.     REPEAT
  1015.     UNTIL xfsel.xinput(path,patt,file,'NOW IN ENGLISH!');
  1016. END DoXfsel;
  1017.  
  1018. PROCEDURE DoDemo();
  1019. BEGIN
  1020.     TheTree := 0;                         (* Mit Flag12-Dialog anfangen *)
  1021.     REPEAT
  1022.         Dialog(TIdx[TheTree]);    (* abhandeln...*)
  1023.     UNTIL TheTree<0
  1024. END DoDemo;
  1025.  
  1026. (*---------------------------------------------------------------------------*)
  1027.  
  1028. PROCEDURE Stretch;
  1029. VAR
  1030.     d: dial.tDial;
  1031. BEGIN
  1032.     dial.init(d,Form20);
  1033.     dial.stretch(d,vwk.charh+4,vwk.charh);
  1034. END Stretch;
  1035.  
  1036. (*--------------------------------------------------------------------*)
  1037.  
  1038. VAR
  1039.     MenuTree: objc.tpTree;
  1040.     d1,d2,d3: dial.tDial;
  1041.     T1,T2,T3: ARRAY[0..19] OF CHAR;
  1042.     D: ARRAY[0..3] OF dial.tDial;
  1043.     DeskTree: objc.tpTree;
  1044.     P2: pops.tPops;
  1045.     Sel2: ARRAY[0..1] OF BITSET;
  1046. (*    pstr: ARRAY[0..29] OF CHAR;*)
  1047.     pstr: ARRAY[0..79] OF CHAR;
  1048.     dr: AES.tRect;
  1049.     Msg: evnt.tMsg;
  1050.     cnt,
  1051.     MoX,MoY,Clicks: SHORTINT;
  1052.     MoState,KState,what: BITSET;
  1053.     Key: AES.tKey;
  1054.     Quit: BOOLEAN;
  1055.     (* Objekt-Demo: *)
  1056.     TheTree: SHORTINT;
  1057.     wrk: AES.tRect;
  1058.     TIdx: ARRAY[0..TMax] OF SHORTINT;
  1059.     TTit: ARRAY[0..TMax] OF xobj.tRStr;
  1060. BEGIN
  1061.     IF vwk.init() & rsrc.load('GEM_DEMO.RSC') THEN
  1062.         rsc.trnfm_all(MaxTree,MaxFrImg);
  1063.         inf.init;
  1064.         vst.alignment(vwk.hdl,vst.LeftJust,vst.TopLine,MoX,MoX);
  1065.         Stretch;                         (* Vorbereiten der Dialoge *)
  1066.         TIdx[ 0] := Form12    ; TTit[ 0] := '  Submenüs...';
  1067.         TIdx[ 1] := Formedit; TTit[ 1] := '  Editieren...';
  1068.         TIdx[ 2] := Form17    ; TTit[ 2] := '  Exttype 17...';
  1069.         TIdx[ 3] := Form18a ; TTit[ 3] := '  Exttype 18-1...';
  1070.         TIdx[ 4] := Form18b ; TTit[ 4] := '  Exttype 18-2...';
  1071.         TIdx[ 5] := Form18c ; TTit[ 5] := '  Exttype 18-3...';
  1072.         TIdx[ 6] := Form19    ; TTit[ 6] := '  Exttype 19...';
  1073.         TIdx[ 7] := Form20    ; TTit[ 7] := '  Exttype 20...';
  1074.         TIdx[ 8] := Form21    ; TTit[ 8] := '  Exttype 21...';
  1075.         TIdx[ 9] := Form22    ; TTit[ 9] := '  Exttype 22...';
  1076.         TIdx[10] := Form23a ; TTit[10] := '  Exttype 23-1...';
  1077.         TIdx[11] := Form23b ; TTit[11] := '  Exttype 23-2...';
  1078.         TIdx[12] := Form24    ; TTit[12] := '  Exttype 24...';
  1079.         TIdx[13] := Form25    ; TTit[13] := '  Exttype 25...';
  1080. (*$? gpb.PIN:
  1081.         (*
  1082.          * für gpb.PIN werden in diesem Dialog die PinButtons demonstriert.
  1083.          * Da vom Gebrauch eines eigenen Desktops aber im Zuge von MultiTOS
  1084.          * und anderen Mehrprogramm-Plattformen abzuraten ist, sollte man
  1085.          * dieses GEMplus-Feature nicht verwenden.
  1086.          *)
  1087.         TIdx[14] := Form26    ; TTit[14] := '  Exttype 26...';
  1088. *)
  1089.         rsrc.gaddr(rsrc.Tree,Menue,MenuTree);
  1090.         xmenu.create(MenuTree);
  1091.         cnt := 20; xmenu.setroll(MenuTree,Tool0,cnt,GetItem);
  1092.         xmenu.bar(MenuTree,TRUE,TRUE);
  1093.         rsrc.gaddr(rsrc.Tree,Desk,DeskTree);
  1094.         dial.init_pin(DeskTree,255,D);
  1095.         desk.install(DeskTree,' TSTwdial ');
  1096.         LoadDesk;
  1097.         IF desk.open(PAR.work,PAR.X,PAR.Y) THEN END;
  1098.         T1 := ' Dialog 1... ';
  1099.         wdial.create(d1,ADR(T1),React,D1,wdial.NoTree,wdial.NoTree);
  1100.         T2 := ' Dialog 2 ';
  1101.         wdial.create(d2,ADR(T2),React,D2,wdial.NoTree,wdial.NoTree);
  1102.         T3 := ' TSTwdial ';
  1103.         wdial.create(d3,ADR(T3),React,D3,D3menue,D3icon);
  1104.         xmenu.bar(d3.DMenu,TRUE,FALSE);
  1105.         wdial.move(d3,0,vwk.wrk.y);
  1106.         wdial.move(d2,vwk.xmax-d2.Tree^[0].pos.w,vwk.wrk.y);
  1107.         dial.init(D[0],D4);
  1108.         dial.init(D[1],D5);
  1109.         dial.init(D[2],Popmenu);
  1110.         dial.init(D[3],Setroll);
  1111.         list.create(d2,D2list,D2vslid,vwk.charh,0,32,DrawIt,
  1112.             ADR(Sel2),0,xobj.Sel0_n,NIL);
  1113.         list.create_hor(d2,D2list,D2hslid,vwk.charw,0,18);
  1114.         util.arr_setval(d2,D2arr,0,-999,999);
  1115.         pstr := 'A:|B:|C:|D:|E:|F:|G:|H:|I:';
  1116.         pops.create2(d2,D2pop,0,pstr,p2);
  1117.         mouse.arrow;
  1118.         MCnt := 0;
  1119.         IF wdial.open(d2,0) & wdial.open(d3,0) THEN
  1120.             Quit := FALSE;
  1121.             mouse.update(TRUE);
  1122.             REPEAT
  1123.                 mouse.update(FALSE);
  1124.                 what := evnt.multi({evnt.Keybd,evnt.Button,evnt.Mesag},2,{0},{0},
  1125.                     FALSE,dr,FALSE,dr,Msg,0,MoX,MoY,MoState,KState,Key,Clicks);
  1126.                 mouse.update(TRUE);
  1127.                 IF (evnt.Keybd IN what)
  1128.                  & DoKey(Key,KState)
  1129.                  & wdial.keybd(Key,MoState,KState) THEN
  1130.  
  1131.                 END;
  1132.                 IF (evnt.Button IN what)
  1133.                  & wdial.button(Clicks,MoX,MoY,MoState,KState)
  1134.                  & dial.button(MoX,MoY,DoDial) THEN
  1135.                     DoButton(MoX,MoY,Clicks)
  1136.                 END;
  1137.                 IF (evnt.Mesag IN what) THEN
  1138.                  IF desk.mesag(Msg)
  1139.                  & wdial.mesag(Msg) THEN
  1140.                     IF Msg.type=evnt.Selected THEN
  1141.                         DoMenu(Msg.title,Msg.entry)
  1142.                     END
  1143.                  END
  1144.                 END
  1145.             UNTIL Quit;
  1146.             mouse.update(FALSE)
  1147.         END;
  1148.         wdial.close_all;
  1149.         desk.close;
  1150.         xmenu.bar(MenuTree,FALSE,TRUE);
  1151.         xmenu.delete(MenuTree);
  1152.         xmenu.bar(d3.DMenu,FALSE,FALSE);
  1153.         SaveDesk;
  1154.         rsrc.free
  1155.     END
  1156. END GEM_DEMO.
  1157.